﻿/**
* Copyright (C) 2014-2050 
* All rights reserved.
* 
* @file       eventcrack.h
* @brief      
* @version    v1.0      
* @author     SOUI group   
* @date       2014/09/05
* 
* Describe    SOUI系统中使用的事件映射宏
*/


#define EVENT_MAP_BEGIN()                           \
public:                                          \
    virtual BOOL _HandleEvent(SOUI::EventArgs *pEvt)\
    {                                               \
        UINT      uCode = pEvt->GetID();            \
		UINT	  nCount = 0;                       \


#define EVENT_MAP_DECLEAR()                         \
protected:                                          \
    virtual BOOL _HandleEvent(SOUI::EventArgs *pEvt);\
    

#define EVENT_MAP_BEGIN2(classname)                 \
    BOOL classname::_HandleEvent(SOUI::EventArgs *pEvt)\
    {                                               \
        UINT      uCode = pEvt->GetID();            \
		UINT	  nCount = 0;                       \


#define EVENT_MAP_END()                             \
	    if(pEvt->bubbleUp)                          \
		{                                           \
		     BOOL bRet = __super::_HandleEvent(pEvt);\
			 nCount += bRet?1:0;                     \
		}                                           \
		return nCount>0;                            \
    }                                               \

#define EVENT_MAP_BREAK()                           \
        return nCount>0;                            \
    }                                               \
 
#define CHAIN_EVENT_MAP(ChainClass)                 \
    if(pEvt->bubbleUp)                              \
	{\
		BOOL bRet = ChainClass::_HandleEvent(pEvt);  \
		nCount += bRet?1:0;                          \
		if(bRet && !pEvt->bubbleUp)                  \
		    return TRUE;                             \
	}
 
#define CHAIN_EVENT_MAP_MEMBER(theChainMember)      \
	if(pEvt->bubbleUp)                              \
	{\
		BOOL bRet = (theChainMember)._HandleEvent(pEvt);  \
		nCount += bRet?1:0;                          \
		if(bRet && !pEvt->bubbleUp)                  \
		    return TRUE;                             \
	}

#define EVENT_CHECK_SENDER_ROOT(pRoot)              \
    {                                               \
		if(!pRoot) return FALSE;\
		SOUI::SWindow *pWnd = SOUI::sobj_cast<SOUI::SWindow>(pEvt->sender);\
		if(pWnd && pRoot != pWnd && !pWnd->IsDescendant(pRoot)) \
			return FALSE;                               \
    }

// void OnEvent(EventArgs *pEvt)
#define EVENT_HANDLER(cd, func)                     \
    if(cd == uCode)                                 \
    {                                               \
	    nCount++;                                   \
        pEvt->bubbleUp = false; func(pEvt);			\
		if(!pEvt->bubbleUp) return TRUE;            \
    } 


// void OnEvent(EventArgs *pEvt)
#define EVENT_ID_HANDLER(id, cd, func)              \
    if(cd == uCode && id == pEvt->idFrom)           \
    {                                               \
	    nCount++;                                   \
        pEvt->bubbleUp = false; func(pEvt);         \
		if(!pEvt->bubbleUp) return TRUE;            \
    }

// void OnEvent(EventArgs *pEvt)
#define EVENT_ID_RANGE_HANDLER(idMin, idMax , cd, func) \
    if(cd == uCode  && idMin <= pEvt->idFrom && idMax >= pEvt->idFrom )\
    {                                               \
	    nCount++;                                   \
        pEvt->bubbleUp = false; func(pEvt);         \
		if(!pEvt->bubbleUp) return TRUE;            \
    }


// void OnEvent(EventArgs *pEvt)
#define EVENT_NAME_HANDLER(name, cd, func)          \
    if(cd == uCode && pEvt->nameFrom!= NULL && wcscmp(pEvt->nameFrom,name)==0) \
    {                                               \
	    nCount++;                                   \
        pEvt->bubbleUp = false; func(pEvt);         \
		if(!pEvt->bubbleUp) return TRUE;            \
    }


// void OnCommand(EventArgs *pEvt)
#define EVENT_COMMAND(func)                         \
    if (SOUI::EVT_CMD == uCode)                     \
    {                                               \
	    nCount++;                                   \
        pEvt->bubbleUp = false; func(pEvt);         \
		if(!pEvt->bubbleUp) return TRUE;            \
    }                                               \

// void OnCommand()
#define EVENT_ID_COMMAND(id, func)                   \
    if (SOUI::EVT_CMD == uCode && id == pEvt->idFrom)\
    {                                                \
	    nCount++;                                   \
        pEvt->bubbleUp = false; func();              \
		if(!pEvt->bubbleUp) return TRUE;             \
    }                                                \
 
// void OnCommand(int nID)
#define EVENT_ID_COMMAND_RANGE(idMin, idMax, func)   \
    if (SOUI::EVT_CMD == uCode && idMin <= pEvt->idFrom && idMax >= pEvt->idFrom )  \
    {                                                \
	    nCount++;                                   \
        pEvt->bubbleUp = false; func(pEvt->idFrom);  \
		if(!pEvt->bubbleUp) return TRUE;             \
    }                                                \

// void OnCommand()
#define EVENT_NAME_COMMAND(name, func)               \
    if (SOUI::EVT_CMD == uCode && pEvt->nameFrom!= NULL && wcscmp(pEvt->nameFrom,name)==0)  \
    {                                                \
	    nCount++;                                   \
        pEvt->bubbleUp = false; func();              \
		if(!pEvt->bubbleUp) return TRUE;             \
    }                                                \

 
// BOOL OnContextMenu(CPoint pt)
#define EVENT_ID_CONTEXTMENU(id,func)                                      \
    if (SOUI::EVT_CTXMENU == uCode && pEvt->idFrom==id)      \
	{                                                                          \
	    nCount++;                                                              \
		pEvt->bubbleUp = false;                                                \
		SOUI::EventCtxMenu* pEvtCtxMenu = (SOUI::EventCtxMenu*)pEvt;           \
		pEvtCtxMenu->bCancel=func(pEvtCtxMenu->pt);                            \
		if(!pEvt->bubbleUp) return TRUE;                                       \
	}                                                                          \


// BOOL OnContextMenu(CPoint pt)
#define EVENT_NAME_CONTEXTMENU(name,func)                                       \
    if (SOUI::EVT_CTXMENU == uCode && pEvt->nameFrom!= NULL && wcscmp(pEvt->nameFrom,name)==0) \
	{                                                                               \
	    nCount++;                                                                   \
		pEvt->bubbleUp = false;                                                     \
		SOUI::EventCtxMenu* pEvtCtxMenu = (SOUI::EventCtxMenu*)pEvt;                \
		pEvtCtxMenu->bCancel=func(pEvtCtxMenu->pt);                                 \
		if(!pEvt->bubbleUp) return TRUE;                                            \
	}                                                                               \

